package com.boil.qz.safekavass.web.controller;

import com.boil.exception.BaseException;
import com.boil.pojo.Page2Vo;
import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.model.LoginUser;
import com.boil.qz.safekavass.model.SecurityCommitteeUnitEntity;
import com.boil.qz.safekavass.pojo.LoginUserVo;
import com.boil.qz.safekavass.service.LoginUserService;
import com.boil.qz.safekavass.service.SecurityCommitteeUnitService;
import com.boil.qz.safekavass.web.request.param.*;
import com.boil.util.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.Valid;
import java.util.List;

/**
 * Created by ChenYong on 2017-04-15.
 * <br>
 * 用户 Controller。
 */
@Controller
@RequestMapping("/web")
public class LoginUserController extends OkBaseController {
    /**
     * 注入用户 Service
     */
    @Autowired
    private LoginUserService loginUserService;
    /**
     * 注入安委会成员单位 Service
     */
    @Autowired
    private SecurityCommitteeUnitService securityCommitteeUnitService;

    /**
     * 用户列表页面。
     *
     * @param model 模型
     * @return 用户列表页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/user/list.html")
    public String listHtml(Model model) {
        ResultVo resultVo = new ResultVo();
        List<SecurityCommitteeUnitEntity> securityCommitteeUnitEntities = securityCommitteeUnitService.findAll();

        resultVo.setResults(securityCommitteeUnitEntities);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/user/list";
    }

    /**
     * 添加用户页面。
     *
     * @param model 模型
     * @return 添加用户页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/user/add.html")
    public String addHtml(Model model) {
        ResultVo resultVo = new ResultVo();
        List<SecurityCommitteeUnitEntity> securityCommitteeUnitEntities = securityCommitteeUnitService.findAll();

        resultVo.setResults(securityCommitteeUnitEntities);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/user/add";
    }

    /**
     * 获取用户列表 json。
     *
     * @param model  模型
     * @param param  用户列表的请求参数
     * @param errors 请求参数的校验结果
     * @return 用户列表 json
     */
    @RequestMapping(method = RequestMethod.GET, value = "/user/list.json")
    @ResponseBody
    public ResultVo listJson(Model model, @Valid LoginUserListParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 查询分页实例
        Page2<LoginUserVo> page2 = Utils.getPage2(request, param, Constants.ID_STR);
        page2.getParams().put("loginid", param.getLoginid());
        page2.getParams().put("loginName", param.getLoginName());
        page2.getParams().put("industryCode", param.getIndustryCode());
        page2.getParams().put("secComUnitCode", param.getSecComUnitCode());
        page2.getParams().put("isLeader", param.getIsLeader());

        // 分页查询
        loginUserService.findInPage(page2);

        // 获取 DataTables 专用分页映射实例
        Page2Vo<LoginUserVo> page2Vo = Utils.getPage2Vo(param, page2);

        resultVo.setResult(page2Vo);

        return resultVo;
    }

    /**
     * 验证账号是否存在。
     *
     * @param model   模型
     * @param loginid 登录 ID
     * @return 结果 json
     */
    @RequestMapping(method = RequestMethod.GET, value = "/user/check/loginid.json")
    @ResponseBody
    public ResultVo checkLoginid(Model model, String loginid) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        // 账号非空
        if (StringUtils.isNotBlank(loginid)) {
            // 账号的格式正确
            if (loginid.matches(Constants.ACCOUNT_RE)) {
                LoginUser user = loginUserService.findByLoginid(loginid);

                // 账号未存在
                if (user == null) {
                    resultVo.setResultCode(Constants.SUCCESS);
                    resultVo.setResultMsg(Constants.ACCOUNT_NOT_EXIST_MSG);

                    // 账号已存在
                } else {
                    resultVo.setResultCode(Constants.ACCOUNT_EXIST);
                    resultVo.setResultMsg(Constants.ACCOUNT_EXIST_MSG);
                }

                // 账号的格式不正确
            } else {
                resultVo.setResultCode(Constants.ACCOUNT_FORMAT_ERROR);
                resultVo.setResultMsg(Constants.ACCOUNT_FORMAT_ERROR_MSG);
            }

            resultVo.setResult(loginid);

            // 账号为空
        } else {
            resultVo.setResultCode(Constants.ACCOUNT_EMPTY);
            resultVo.setResultMsg(Constants.ACCOUNT_EMPTY_MSG);
        }

        return resultVo;
    }

    /**
     * 添加用户。
     *
     * @param model  模型
     * @param param  添加用户的请求参数
     * @param errors 请求参数的校验结果
     * @return 重定向到用户列表页面--->“redirect:/user/list.html”
     */
    @RequestMapping(method = RequestMethod.POST, value = "/user/add.html")
    public String add(Model model, @Valid AddLoginUserParam param, BindingResult errors) {
        // 获取用户
        LoginUser user = loginUserService.findByLoginid(param.getLoginid());

        // 如果用户已存在，禁止保存
        if (user != null) {
            throw new BaseException(Constants.ACCOUNT_EXIST_MSG);
        }

        // 创建用户实例
        user = new LoginUser();
        user.setLoginid(param.getLoginid());
        user.setLoginName(param.getLoginName());
        user.setPwd(ShiroUtils.passwd2Md5(param.getPasswd()));
        user.setCollieryNo(param.getCollieryNo());
        user.setIndustryCode(param.getIndustryCode());
        user.setSecComUnitCode(param.getSecComUnitCode());
        user.setIsLeader(param.getIsLeader());

        // 保存用户
        loginUserService.save(user);

        return "redirect:/web/user/list.html";
    }

    /**
     * 我的信息页面。
     *
     * @param model 模型
     * @return 我的信息页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/my.html")
    public String myHtml(Model model) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 获取登录用户
        LoginUser loginUser = getLoginUser();
        // 查询我的信息
        LoginUser my = loginUserService.findOne(loginUser.getId());

        List<SecurityCommitteeUnitEntity> securityCommitteeUnitEntities = securityCommitteeUnitService.findAll();

        resultVo.setResult(my);
        resultVo.setResults(securityCommitteeUnitEntities);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/my/update";
    }

    /**
     * 更新我的信息。
     *
     * @param model  模型
     * @param param  更新用户的请求参数
     * @param errors 请求参数的校验结果
     * @return 我的信息页面
     */
    @RequestMapping(method = RequestMethod.POST, value = "/my.html")
    public String my(Model model, @Valid UpdateLoginUserParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 更新用户信息
        LoginUser loginUser = loginUserService.updateMy(param);
        List<SecurityCommitteeUnitEntity> securityCommitteeUnitEntities = securityCommitteeUnitService.findAll();

        for (SecurityCommitteeUnitEntity securityCommitteeUnitEntity : securityCommitteeUnitEntities) {
            if (securityCommitteeUnitEntity.getCode().equals(loginUser.getSecComUnitCode())) {
                loginUser.setSecComUnitName(securityCommitteeUnitEntity.getName());

                break;
            }
        }

        resultVo.setResult(loginUser);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/my/detail";
    }

    /**
     * 更新用户页面。
     *
     * @param model  模型
     * @param param  ID 请求参数
     * @param errors 请求参数的校验结果
     * @return 更新用户页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/user/update.html")
    public String updateHtml(Model model, @Valid IdParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 获取用户
        LoginUser user = loginUserService.findOne(param.getId());
        List<SecurityCommitteeUnitEntity> securityCommitteeUnitEntities = securityCommitteeUnitService.findAll();

        resultVo.setResult(user);
        resultVo.setResults(securityCommitteeUnitEntities);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/user/update";
    }

    /**
     * 更新用户。
     *
     * @param model  模型
     * @param param  更新用户的请求参数
     * @param errors 请求参数的校验结果
     * @return 重定向到用户列表页面--->“redirect:/user/list.html”
     */
    @RequestMapping(method = RequestMethod.POST, value = "/user/update.html")
    public String update(Model model, @Valid UpdateLoginUserParam2 param, BindingResult errors) {
        loginUserService.update(param);

        return "redirect:/web/user/list.html";
    }

    /**
     * 更新密码的页面。
     *
     * @param model 模型
     * @return 更新密码的页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/my/passwd.html")
    public String passwdHtml(Model model) {
        return "/my/passwd";
    }

    /**
     * 更新密码。
     *
     * @param model  模型
     * @param param  更新密码的请求参数
     * @param errors 请求参数的校验结果
     * @return 结果页面
     */
    @RequestMapping(method = RequestMethod.POST, value = "/my/passwd.html")
    public String passwd(Model model, @Valid PasswdParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        loginUserService.updateMyPasswd(resultVo, param);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/common/result";
    }

    /**
     * 删除用户 json。
     *
     * @param model  模型
     * @param param  ID 参数
     * @param errors 请求参数的校验结果
     * @return 结果 json
     */
    @RequestMapping(method = RequestMethod.GET, value = "/user/delete.json")
    @ResponseBody
    public ResultVo delete(Model model, @Valid IdParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        // 删除
        loginUserService.deleteById(param.getId());

        resultVo.setResultMsg("删除用户成功");

        return resultVo;
    }
}